#!/sbin/ash
# shellcheck shell=dash

# Copyright 2017 Attila Szöllősi
#
# This file is part of postmarketos-android-recovery-installer.
#
# postmarketos-android-recovery-installer is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# postmarketos-android-recovery-installer is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with postmarketos-android-recovery-installer.  If not, see <http://www.gnu.org/licenses/>.

export OUTFD=$1
export ZIP=$2
export WORKING_DIR="/tmp/postmarketos"
export PATH=$PATH:"$WORKING_DIR"/bin

# Use findfs and umount from util-linux
# shellcheck disable=SC2139
alias findfs="$WORKING_DIR/bin/findfs"
# shellcheck disable=SC2139
alias umount="$WORKING_DIR/bin/umount"

# shellcheck source=/dev/null
. "$WORKING_DIR"/install_options

# taken from https://github.com/Debuffer-XDA/Gov-Tuner/blob/master/META-INF/com/google/android/update-binary
# Copyright (c) 2016 - 2017 Debuffer
ui_print() {
	echo -n -e "ui_print $1\n" > /proc/self/fd/"$OUTFD"
	echo -n -e "ui_print\n" > /proc/self/fd/"$OUTFD"
}

extract_partition_table() {
	case "$INSTALL_PARTITION" in
		"system")
			_INSTALL_DEVICE=$(findfs PARTLABEL="$SYSTEM_PARTLABEL") || \
				# We need to resolve symlinks, to make set_subpartitions() work.
				_INSTALL_DEVICE=$(busybox readlink -fn "$(awk '/^\/system/ {print $3}' /etc/recovery.fstab)")
			;;
		"external_sd")
			_INSTALL_DEVICE=$(busybox readlink -fn "$(awk '/^\/external_sd/ {print $4}' /etc/recovery.fstab)")
			;;
		*)
			echo "No support for flashing $INSTALL_PARTITION."
			return 1
			;;
	esac
	if [ ! -z "$_INSTALL_DEVICE" ]
	then
		echo "install device found at $_INSTALL_DEVICE"
		export INSTALL_DEVICE=$_INSTALL_DEVICE
	else
		echo "Couldn't find $INSTALL_PARTITION partition."
		return 1
	fi
	if [ "$ISOREC" = "true" ]
	then
		export KERNEL_PARTITION
		KERNEL_PARTITION=$(findfs PARTLABEL="$KERNEL_PARTLABEL")
		export INITFS_PARTITION
		INITFS_PARTITION=$(findfs PARTLABEL="$INITFS_PARTLABEL")
	else
		_BOOT_PARTITION=$(findfs PARTLABEL="boot") || \
			_BOOT_PARTITION=$(awk '/^\/boot/ {print $3}' /etc/recovery.fstab)
		if [ ! -z "$_BOOT_PARTITION" ]
		then
			echo "boot partition found at $_BOOT_PARTITION"
			export BOOT_PARTITION=$_BOOT_PARTITION
		else
			echo "Couldn't find boot partition."
			return 1
		fi
	fi
}

partition_install_device() {
	for command in "mktable msdos" \
		"mkpart primary ext2 2048s 100M" \
		"mkpart primary 100M 100%" \
		"set 1 boot on"
	do
		parted -s "$INSTALL_DEVICE" "$command"
	done
	partprobe
	if [ "$INSTALL_PARTITION" = "system" ]
	then
		kpartx -afs "$INSTALL_DEVICE"
	fi
	set_subpartitions
}

set_subpartitions() {
	export PMOS_BOOT
	PMOS_BOOT=/dev/mapper/"$(busybox basename "$INSTALL_DEVICE")"p1
	export ROOT_PARTITION
	ROOT_PARTITION=/dev/mapper/"$(busybox basename "$INSTALL_DEVICE")"p2
}

umount_install_partition() {
	if busybox mountpoint -q "/$INSTALL_PARTITION/"
	then
		umount -R /"$INSTALL_PARTITION"/
	else
		echo 'Continuing...'
		return 0
	fi
}
